// 作用域和闭包问题
let title = "后盾人";

function show() {
  let url = "houdunren.com";
  function hd() {
    let site = "hdcms";
    console.log(url);
  }
  hd();
}
show();

// 延迟变量的生命周期, 被用到就可以延长，返回一个函数，调用hd的时候,用变量m去接收hd函数的返回值，这样子就是被用到了所以可以延长其生命周期
function hd() {
  let a = 1;
  return function sum() {
    let b = 1;
    return function show() {
      console.log("b:", +(++b));
      console.log("a:", +(++a));
    };
  };
}
let m = hd()();

// 构造函数, 一样是可以保留值的，每次new一下就开辟一块新的空间
function HD1() {
  let n = 1;
  this.sum = function () {
    console.log(++n);
  };
}
let aa = new HD1();
aa.sum();

for (var i = 0; i <= 3; i++) {
  console.log(i);
}
console.log("var", i);

// 多级作用域嵌套,这里的var不会和push中的那个函数在同一块内存，他只会在windows中存在，所以当你调用函数的时候，发现在同级目录没有，就会往上找，找到了Windows对象，for级作用域，立即执行函数作用域，以及push进去的作用域
let arr = [];
for (var i = 0; i <= 3; i++) {
  // i值，没有被保留
  // arr.push(function () {
  //     return i;
  //   });

  // 会产生一个立即执行函数作用域
  (function (i) {
    arr.push(function () {
      return i;
    });
  })(i);
}
console.log(arr[0]());

let lessons = [
  {
    title: "裙子",
    price: 500,
  },
  {
    title: "iphoneX",
    price: 1900,
  },
  {
    title: "ipad",
    price: 1200,
  },
];

function between(a, b) {
  return function (v) {
    return v.price >= a && v.price <= b;
  };
}

console.table(lessons.filter(between(10, 1500)));

const dataShop = [
  {
    title: "lol",
    click: 89,
    price: 100,
  },
  {
    title: "Dnf",
    click: 19,
    price: 231,
  },
  {
    title: "cf",
    click: 42,
    price: 39,
  },
];

function order(field, type = "desc") {
  return function (a, b) {
    if (type == "asc") return a[field] > b[field] ? 1 : -1;
    return a[field] > b[field] ? -1 : 1;
  };
}

console.table(dataShop.sort(order("price")));

let hd2 = {
  user: "jason",
  get: function () {
    // 1.两种办法 const _this = this
    // 2. 箭头函数, 当前作用域没有会往父级找
    return () => {
      // 1. return this.user
      return this.user;
    };
  },
};

let a = hd2.get();
// console.log(hd2.get()());
console.log(a()); //这样子相当于全局调用, 所以this指向windows
